#pragma once

#include "engine/core/window.h"
#include <memory>
#include "engine/renderer/render_system2d.h"
#include "engine/renderer/screen_space_renderer.h"
#include "engine/renderer/render3d/mesh_renderer.h"

#include "engine/core/camera2d.h"
#include "engine/core/camera3d.h"
#include "engine/core/ui_layer.h"
#include "engine/core/logging.h"
#include "engine/platform/framebuffer.h"


namespace kanon
{
    class BaseApp
    {
    public:
        Logger& logger;
        std::shared_ptr<Window> window;
        std::shared_ptr<ActorSystem> actor_system;
        std::shared_ptr<UILayer> ui_layer;

    public:
        BaseApp();
        virtual ~BaseApp();

        void Run();
        void Update(float deltaTime);
        virtual void RenderUI() {}

        virtual void Initialize();
        virtual void Render() = 0;
    protected:
        virtual void RegisterEvents() = 0;
    };
}
